comp.lang.c ++. moderated에서 C ++ / STL의 숨겨진 기능과 다크 코너를 읽은 후 다음 코드 조각이 Visual Studio 2008과 G ++ 4.4에서 컴파일되고 작동한다는 사실에 완전히 놀랐습니다. 코드는 다음과 같습니다. #includeint main () { int x = 10; while (x-> 0) // x는 0이됩니다. { printf ( "% d", x); } } 산출: 9876 5 4 3 2 1 0 GCC에서도 작동하기 때문에 이것이 C라고 가정합니다. 이것이 표준에서 정의 된 위치와 출처는 어디입니까?
2020-12-07 21:24:25
->은 연산자가 아닙니다. 실제로 두 개의 개별 연산자-및>입니다. 조건부 코드는 x를 감소시키고 x의 원래 (감소되지 않은) 값을 반환 한 다음> 연산자를 사용하여 원래 값을 0과 비교합니다. 더 잘 이해하기 위해 다음과 같이 성명을 작성할 수 있습니다. while ((x--)> 0) | 또는 완전히 다른 것을 위해 ... x는 0으로 미끄러집니다. 동안 (x-\ \ \ \ > 0) printf ( "% d", x); 그다지 수학적이지는 않지만 ... 모든 그림은 천 단어를 그린다 ... | 이것은 매우 복잡한 연산자이므로 ISO / IEC JTC1 (공동 기술위원회 1)조차도 C ++ 표준의 두 부분에 설명을 배치했습니다. 농담을 제외하고는 두 개의 다른 연산자입니다.-및>는 각각 C ++ 03 표준의 §5.2.6 / 2 및 §5.9에 설명되어 있습니다. | 다음과 같습니다. 동안 (x--> 0) x-(사후 감소)는 x = x-1과 동일하므로 코드는 다음과 같이 변환됩니다. while (x> 0) { x = x-1; // 논리 } 엑스--; // x <= 0 일 때 수행되는 포스트 감소 | x는 반대 방향으로 더 빨리 0으로 갈 수 있습니다. int x = 10; 동안 (0 <---- x) { printf ( "% d", x); } 8 6 4 2 화살표로 속도를 제어 할 수 있습니다! int x = 100; while (0 <-------------------- x) { printf ( "% d", x); } 90 80 70 60 50 40 30 20 10 ;) | 이것의 #includeint main (void) { int x = 10; while (x--> 0) {// x는 0이됩니다. printf ( "% d", x); } 반환 0; } 공간 만 있으면 상황이 재미있어 보입니다. 감소하고 비교합니다. | ->의 사용법은 역사적 관련성이 있습니다. 감소는 x86 아키텍처에서 증가하는 것보다 빠릅니다. ->를 사용하면 x가 0이되고 수학적 배경을 가진 사람들에게 호소력이 있습니다. | 동안 (x--> 0) 그것이 파싱되는 방법입니다. | 정말 괴짜이지만 이것을 사용할 것입니다. #define as; while int main (int argc, char * argv []) { int n = atoi (argv [1]); do printf ( "n is % d \ n", n) as (n-> 0); 반환 0; } | 내가 읽은 한 책 (어떤 책이 정확히 기억이 나지 않습니다)은 다음과 같이 말했습니다. 컴파일러는 왼쪽 오른쪽 규칙을 사용하여 표현식을 가장 큰 토큰으로 구문 분석하려고합니다. 이 경우 표현식 : x-> 0 가장 큰 토큰으로 구문 분석 : 토큰 1 : x 토큰 2 :- 토큰 3 :> 토큰 4 : 0 결론 : x--> 0 이 표현식에도 동일한 규칙이 적용됩니다. a ----- b 구문 분석 후 : 토큰 1 : a 토큰 2 :- 토큰 3 :- 토큰 4 :- 토큰 5 : b 결론 : (a-)--b 복잡한 표현을 이해하는데 도움이 되었으면 좋겠습니다 ^^ | 이것은 정확히 동일합니다 동안 (x--) { printf ( "% d", x); } 음수가 아닌 수 | 어쨌든, 이제 "goes to"연산자가 있습니다. "->"는 방향으로 기억하기 쉽고 "x가 0이되는 동안"은 곧바로 의미합니다. 또한 일부 플랫폼에서는 "for (x = 10; x> 0; x-)"보다 약간 더 효율적입니다. | 이 코드는 먼저 x와 0을 비교 한 다음 x를 감소시킵니다. (또한 첫 번째 답변에서 말했습니다. x를 사후 감소한 다음 x와 0을> 연산자로 비교합니다.)이 코드의 출력을 참조하십시오. 9876 5 4 3 2 1 0 이제 먼저 비교 한 다음 출력에서 0을 확인하여 감소합니다. 먼저 감소한 다음 비교하려면 다음 코드를 사용하십시오. #include int main (void) { int x = 10; while (--x> 0) // x는 0이됩니다. { printf ( "% d", x); } 반환 0; } 출력은 다음과 같습니다. 9876 5 4 3 2 1 | 이 코드를 실행하면 컴파일러에서 9876543210을 출력합니다. #include int main () { int x = 10; while (x-> 0) // x는 0이됩니다. { std :: cout << x; } } 예상대로. while (x--> 0)은 실제로 while (x> 0)을 의미합니다. x-- 포스트는 x를 감소시킵니다. 동안 (x> 0) { 엑스--; std :: cout << x; } 같은 것을 쓰는 다른 방법입니다. 원본이 "x가 0이되는 동안"처럼 보이는 것이 좋습니다. | -와> 사이에 공백이 있습니다. x는 포스트 감소, 즉 조건 x> 0?을 확인한 후 감소합니다. | -감소 연산자이고>는보다 큼 연산자입니다. 두 연산자는->와 같이 단일 연산자로 적용됩니다. | 두 연산자의 조합입니다. 첫 번째-값을 감소시키기위한 것이고>는 값이 오른쪽 피연산자보다 큰지 확인하기위한 것입니다. #include int main () { int x = 10; 동안 (x--> 0) printf ( "% d", x); 반환 0; } 출력은 다음과 같습니다. 9876 5 4 3 2 1 0 | 실제로 x는 감소 후이며 해당 조건을 확인하고 있습니다. -> 아님, (x--)> 0 참고 : x의 값은 감소 후이므로 조건을 확인한 후에 변경됩니다. 다음과 같은 유사한 경우도 발생할 수 있습니다. -> x-> 0 ++> x ++> 0 -> = x-> = 0 ++> = x ++> = 0 | C와 C ++는 "maximum munch"규칙을 따릅니다. a --- b가 (a--)-b로 번역되는 것과 같은 방식으로, 귀하의 경우 x-> 0은 (x-)> 0으로 번역됩니다. 규칙이 본질적으로 말하는 것은 왼쪽에서 오른쪽으로 이동하면 유효한 표현을 형성 할 최대 문자를 취하여 표현이 형성된다는 것입니다. | 왜 모든 합병증입니까? 원래 질문에 대한 간단한 대답은 다음과 같습니다. #include int main () { int x = 10; 동안 (x>0) { printf ( "% d", x); x = x-1; } } 같은 일을합니다. 나는 당신이 이렇게해야한다고 말하는 것이 아니라 같은 일을하고 하나의 게시물에서 질문에 대답했을 것입니다. x--는 위의 약어이고>는 보통보다 큼 연산자입니다. 큰 미스터리가 아닙니다! 요즘은 단순한 일을 복잡하게 만드는 사람이 너무 많아요;) | 기존 방식으로 while 루프 괄호 ()에 조건을 정의하고 중괄호 {} 안에 종료 조건을 정의하지만->는 두 가지를 동시에 정의합니다. 예를 들면 : int abc (void) { int a = 5 while ((a--)> 0) // 감소와 비교를 동시에 { // 코드 } } 이것은 a를 감소시키고 a가 0보다 큰 동안 루프를 실행합니다. 일반적으로 다음과 같습니다. int abc (void) { int a = 5; 동안 (a> 0) { ㅏ--; // 코드 } ㅏ--; } 두 가지 방법 모두 동일한 일을하고 동일한 목표를 달성합니다. | (x-> 0)은 (x--> 0)을 의미합니다. (x->)를 사용할 수 있습니다. 출력 : 987654321 0 (-x> 0) 평균 (--x> 0)을 사용할 수 있습니다. 출력 : 9876 5 4 3 2 1 당신이 사용할 수있는 (-\ \ x> 0) 출력 : 9876 5 4 3 2 1 당신이 사용할 수있는 (\ \ x-> 0) 출력 : 9876 5 4 3 2 1 0 당신이 사용할 수있는 (\ \ x-> 0 \ \ ) 출력 : 9876 5 4 3 2 1 0 당신은 또한 사용할 수 있습니다 ( 엑스 -> ) 출력 : 9876 5 4 3 2 1 0 마찬가지로이 명령을 성공적으로 실행하기 위해 많은 방법을 시도 할 수 있습니다. | 여기-단항 사후 감소 연산자입니다. while (x--> 0) // x는 0이됩니다. { printf ( "% d", x); } 처음에 조건은 다음과 같이 평가됩니다. (x> 0) // 10> 0 이제 조건이 참이므로 감소 된 값으로 루프로 이동합니다. x-- // x = 9 그래서 첫 번째 인쇄 된 값이 9입니다. 등등. 마지막 루프에서 x = 1이므로 조건이 참입니다. 단항 연산자에 따라 인쇄시 값이 x = 0으로 변경되었습니다. 이제 x = 0, 조건 (x> 0)을 false로 평가하고 while 루프가 종료됩니다. | 이->는 전혀 연산자가 아닙니다. ->와 같은 연산자가 있지만->와는 다릅니다. 이는 단순히 x에 사후 감소 연산자가 있고이 루프가 0보다 클 때까지 실행된다는 것을 의미하는 while (x--> 0)의 잘못된 해석입니다. 이 코드를 작성하는 또 다른 간단한 방법은 while (x--)입니다. while 루프는 거짓 조건이 발생할 때마다 중지되며 여기에는 하나의 경우, 즉 0 만 있습니다. 따라서 x 값이 0으로 감소하면 중지됩니다. | 매우 적극적인 질문입니다. 이 질문에 답하기 위해 평판 10을 획득하십시오. 평판 요구 사항은 스팸 및 비 응답 활동으로부터이 질문을 보호하는 데 도움이됩니다. 찾고있는 답변이 아닙니까? C ++ C 연산자 코드 형식 표준 준수 태그가 지정된 다른 질문을 찾아 보거나 직접 질문하십시오.